package com.aya.aop.introduction;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.DeclareParents;
import org.springframework.stereotype.Service;

@Service
@Aspect
public class IntroductionAspect {
    /**
     * 引介增强的表达式匹配的是类
     */
    @DeclareParents(value = "com.aya..*", defaultImpl = DuckFly.class)
    private AnimalFly currentFLy;

    /**
     * 联合表达式:  多个条件同时满足, 就进行切入
     * 注解匹配:  @annotation(com.aya.aop.asp.AopAnnotation) , 满足方法上面的 注解切入条件
     * 当前切面的引介增强: this(animalFly),  满足类的切面条件
     * 连接点参数匹配: 参数类型必须是String的  , 改成 Integer 就切不到了
     *
     * @param animalFly
     * @param name
     */
    @Before("@annotation(com.aya.aop.asp.AopAnnotation) && this(animalFly) && args(name)")
    public void before(AnimalFly animalFly, String name) {
        animalFly.fly(name);
    }
}
